package chaoyue.study.safe;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 只使用Volatile 并不能解决这里的线程安全问题
 * 本质原因还是在于++操作不是原子操作，依然会发生旧值覆盖的问题
 * 使用加锁的方式可以解决这个问题
 * 或者使用原子类，采用CAS的方式来解决
 */
public class IncreaseTest {
    private volatile static int COUNT = 0;
    private static final AtomicInteger COUNT_ATOMIC = new AtomicInteger(0);
    private static int COUNT_LOCK = 0;


    public static void main(String[] args) throws InterruptedException {
        Runnable r = () -> {
            for (int i = 0; i < 10000; i++) {
                COUNT++; // 有线程安全问题的COUNT方式
                COUNT_ATOMIC.addAndGet(1); // 使用原子类解决
                synchronized (IncreaseTest.class) { // 使用同步锁方式解决
                    COUNT_LOCK++;
                }
            }
        };
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);

        t1.start();
        t2.start();
        t1.join();
        t2.join();

        System.out.println("COUNT: " + COUNT);
        System.out.println("COUNT_ATOMIC: " + COUNT_ATOMIC);
        System.out.println("COUNT_LOCK: " + COUNT_LOCK);
    }
}
